/*
 * Copyright 2013 OmniFaces.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.omnifaces.application;

import javax.faces.component.UIViewRoot;
import javax.faces.event.AbortProcessingException;
import javax.faces.event.PreDestroyViewMapEvent;
import javax.faces.event.SystemEvent;
import javax.faces.event.ViewMapListener;

import org.omnifaces.config.BeanManager;

/**
 * Listener for JSF view scope destroy events so that view scope provider implementation can be notified.
 *
 * @author Bauke Scholtz
 * @see ViewScopeProvider
 * @since 1.6
 */
public class ViewScopeEventListener implements ViewMapListener {

	// Actions --------------------------------------------------------------------------------------------------------

	/**
	 * Returns <code>true</code> if given source is an instance of {@link UIViewRoot}.
	 */
	@Override
	public boolean isListenerForSource(Object source) {
		return (source instanceof UIViewRoot);
	}

	/**
	 * If the event is an instance of {@link PreDestroyViewMapEvent}, which means that the JSF view scope is about to
	 * be destroyed, then find the current instance of {@link ViewScopeProvider} and invoke its
	 * {@link ViewScopeProvider#preDestroyView()} method.
	 */
	@Override
	public void processEvent(SystemEvent event) throws AbortProcessingException {
		if (event instanceof PreDestroyViewMapEvent) {
			ViewScopeProvider instance = BeanManager.INSTANCE.getReference(ViewScopeProvider.class);

			if (instance != null) { // May be null when CDI isn't supported on this environment.
				instance.preDestroyView();
			}
		}
	}

}